/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package xml.io;

import java.util.Vector;


/**
 * @author Ficuss
 *
 */
abstract class XmlTokenizer {

    private static int i;
    private static String xml;

    /** esta funcion se encarga se separar los distintos tag y valores del String pasado por parametro.
     * @param xml String que va a ser separado
     * @return vector de String
     */
    static String[] separar(String xml) {
        Vector<String> separado = new Vector<String>();
        XmlTokenizer.xml = xml;
        for (i = 0; i < XmlTokenizer.xml.length(); i++) {
            char c = XmlTokenizer.xml.charAt(i);
            String actual = String.valueOf(c);
            if (c == '<') {
                actual = actual + separarTag();
            } else if (String.valueOf(c).trim().length() != 0) {
                actual = actual + separarContenido();
            }
            actual = actual.trim();
            if (!actual.isEmpty()) {
                separado.add(actual);
            }
        }
        xml = null;
        System.gc();
        return separado.toArray(new String[separado.size()]);
    }

    /**separa el valor contenido dontro el tag
     * @return
     */
    private static String separarContenido() {
        String actual = "";
        for (XmlTokenizer.i = i + 1; i < XmlTokenizer.xml.length(); i++) {
            char c = XmlTokenizer.xml.charAt(i);
            if (c != '<') {
                actual = actual + String.valueOf(c);
            } else {
                break;
            }
        }
        if (i != XmlTokenizer.xml.length()) {
            i--;
        }
        return actual;
    }

    /**
     * @return
     */
    private static String separarDTD() {
        String actual = "";
        for (XmlTokenizer.i = i + 1; i < XmlTokenizer.xml.length(); i++) {
            char c = XmlTokenizer.xml.charAt(i);
            actual = actual + String.valueOf(c);
            if (c == ']') {
                break;
            }
        }
        return actual;
    }

    /**
     * @return
     */
    private static String separarTag() {
        String actual = "";
        for (XmlTokenizer.i = i + 1; i < XmlTokenizer.xml.length(); i++) {
            char c = XmlTokenizer.xml.charAt(i);
            actual = actual + String.valueOf(c);
            if (c == '[') {
                actual = actual + separarDTD();
            } else if (c == '>') {
                break;
            }
        }
        return actual;
    }
}
